package events

import (
	"sync"

	"BookStack/internal/domain/events"
)

// Subscriber 事件订阅者接口
type Subscriber interface {
	// Subscribe 订阅指定类型的事件
	Subscribe(eventType string, handler events.EventHandler) error
	// Unsubscribe 取消订阅指定类型的事件
	Unsubscribe(eventType string) error
	// GetHandlers 获取指定事件类型的所有处理器
	GetHandlers(eventType string) []events.EventHandler
}

// subscriber 事件订阅者实现
type subscriber struct {
	// handlers 存储事件类型到处理器的映射
	handlers map[string][]events.EventHandler
	// mu 用于并发安全
	mu sync.RWMutex
}

// NewSubscriber 创建新的事件订阅者
func NewSubscriber() Subscriber {
	return &subscriber{
		handlers: make(map[string][]events.EventHandler),
	}
}

// Subscribe 订阅指定类型的事件
func (s *subscriber) Subscribe(eventType string, handler events.EventHandler) error {
	s.mu.Lock()
	defer s.mu.Unlock()

	// 检查处理器是否已存在
	handlers := s.handlers[eventType]
	for _, h := range handlers {
		if h == handler {
			return nil // 处理器已存在，直接返回
		}
	}

	// 添加新的处理器
	s.handlers[eventType] = append(handlers, handler)
	return nil
}

// Unsubscribe 取消订阅指定类型的事件
func (s *subscriber) Unsubscribe(eventType string) error {
	s.mu.Lock()
	defer s.mu.Unlock()

	delete(s.handlers, eventType)
	return nil
}

// GetHandlers 获取指定事件类型的所有处理器
func (s *subscriber) GetHandlers(eventType string) []events.EventHandler {
	s.mu.RLock()
	defer s.mu.RUnlock()

	// 返回处理器的副本，避免外部修改
	handlers := s.handlers[eventType]
	if len(handlers) == 0 {
		return nil
	}

	result := make([]events.EventHandler, len(handlers))
	copy(result, handlers)
	return result
}
